{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "059756b7",
   "metadata": {},
   "source": [
    "# CSV"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0a12b7e",
   "metadata": {},
   "source": [
    "[Comma-Separated Values (CSV)](https://en.wikipedia.org/wiki/Comma-separated_values) 파일은 쉼표로 값을 구분하는 구분된 텍스트 파일입니다. 파일의 각 줄은 데이터 레코드입니다. \n",
    "\n",
    "각 레코드는 쉼표로 구분된 하나 이상의 필드로 구성됩니다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "923a83b4",
   "metadata": {},
   "source": [
    "## CSVLoader\n",
    "\n",
    "- CSV 데이터를 문서당 한 행씩 로드합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ea60830d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders.csv_loader import CSVLoader\n",
    "\n",
    "# CSV 로더 생성\n",
    "loader = CSVLoader(file_path=\"./data/titanic.csv\")\n",
    "\n",
    "# 데이터 로드\n",
    "docs = loader.load()\n",
    "\n",
    "print(len(docs))\n",
    "print(docs[0].metadata)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "358f1c4c",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(docs[1].page_content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2136512",
   "metadata": {},
   "source": [
    "### CSV 파싱 및 로딩 커스터마이징\n",
    "\n",
    "[csv module](https://docs.python.org/3/library/csv.html) 문서를 참조하여 지원되는 **csv args**에 대한 자세한 정보를 확인하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a4b1fc3a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 컬럼정보:\n",
    "# PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked\n",
    "\n",
    "# CSV 파일 경로\n",
    "loader = CSVLoader(\n",
    "    file_path=\"./data/titanic.csv\",\n",
    "    csv_args={\n",
    "        \"delimiter\": \",\",  # 구분자\n",
    "        \"quotechar\": '\"',  # 인용 부호 문자\n",
    "        \"fieldnames\": [\n",
    "            \"Passenger ID\",\n",
    "            \"Survival (1: Survived, 0: Died)\",\n",
    "            \"Passenger Class\",\n",
    "            \"Name\",\n",
    "            \"Sex\",\n",
    "            \"Age\",\n",
    "            \"Number of Siblings/Spouses Aboard\",\n",
    "            \"Number of Parents/Children Aboard\",\n",
    "            \"Ticket Number\",\n",
    "            \"Fare\",\n",
    "            \"Cabin\",\n",
    "            \"Port of Embarkation\",\n",
    "        ],  # 필드 이름\n",
    "    },\n",
    ")\n",
    "\n",
    "# 데이터 로드\n",
    "docs = loader.load()\n",
    "\n",
    "# 데이터 출력\n",
    "print(docs[1].page_content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3de64ab",
   "metadata": {},
   "source": [
    "문서 전체를 XML 문서 형식으로 처리하려는 경우\n",
    "- 참고: 0번째 문서는 헤더 정보이기 때문에 스킵합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "106461e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "row = docs[1].page_content.split(\"\\n\")\n",
    "row_str = \"<row>\"\n",
    "for element in row:\n",
    "    splitted_element = element.split(\":\")\n",
    "    value = splitted_element[-1]\n",
    "    col = \":\".join(splitted_element[:-1])\n",
    "    row_str += f\"<{col}>{value.strip()}</{col}>\"\n",
    "row_str += \"</row>\"\n",
    "print(row_str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dca7126d",
   "metadata": {},
   "outputs": [],
   "source": [
    "for doc in docs[1:]:\n",
    "    row = doc.page_content.split(\"\\n\")\n",
    "    row_str = \"<row>\"\n",
    "    for element in row:\n",
    "        splitted_element = element.split(\":\")\n",
    "        value = splitted_element[-1]\n",
    "        col = \":\".join(splitted_element[:-1])\n",
    "        row_str += f\"<{col}>{value.strip()}</{col}>\"\n",
    "    row_str += \"</row>\"\n",
    "    print(row_str)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c62f566",
   "metadata": {},
   "source": [
    "`source_column` 인자를 사용하여 각 행에서 생성된 문서의 출처를 지정하세요. 그렇지 않으면 모든 문서의 출처로 `file_path`가 사용됩니다.\n",
    "\n",
    "이는 CSV 파일에서 로드된 문서를 출처를 사용하여 질문에 답하는 체인에 사용할 때 유용합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c9cf4d5e",
   "metadata": {},
   "outputs": [],
   "source": [
    "loader = CSVLoader(\n",
    "    file_path=\"./data/titanic.csv\", source_column=\"PassengerId\"\n",
    ")  # CSV 로더 설정, 파일 경로 및 소스 컬럼 지정\n",
    "\n",
    "docs = loader.load()  # 데이터 로드\n",
    "\n",
    "print(docs[1])  # 데이터 출력"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de2aeefb",
   "metadata": {},
   "source": [
    "## UnstructuredCSVLoader "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b3cfc80",
   "metadata": {},
   "source": [
    "`UnstructuredCSVLoader`를 사용하여 테이블을 로드할 수도 있습니다. `UnstructuredCSVLoader`를 사용하는 한 가지 장점은 `\"elements\"` 모드에서 사용할 경우, 메타데이터에서 테이블의 HTML 표현이 제공된다는 것입니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "31471f0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders.csv_loader import UnstructuredCSVLoader\n",
    "\n",
    "# 비구조화 CSV 로더 인스턴스 생성\n",
    "loader = UnstructuredCSVLoader(file_path=\"./data/titanic.csv\", mode=\"elements\")\n",
    "\n",
    "# 문서 로드\n",
    "docs = loader.load()\n",
    "\n",
    "# 첫 번째 문서의 HTML 텍스트 메타데이터 출력\n",
    "print(docs[0].metadata[\"text_as_html\"][:1000])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31e0af6a",
   "metadata": {},
   "source": [
    "## DataFrameLoader\n",
    "\n",
    "- Pandas는 Python 프로그래밍 언어를 위한 오픈 소스 데이터 분석 및 조작 도구입니다. 이 라이브러리는 데이터 과학, 머신러닝, 그리고 다양한 분야의 데이터 작업에 널리 사용되고 있습니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d6104f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "# CSV 파일 읽기\n",
    "df = pd.read_csv(\"./data/titanic.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a03d9f7c",
   "metadata": {},
   "source": [
    "첫 5개 행을 조회합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "68610091",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 데이터프레임의 처음 다섯 행 조회\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e3f205d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import DataFrameLoader\n",
    "\n",
    "# 데이터 프레임 로더 설정, 페이지 내용 컬럼 지정\n",
    "loader = DataFrameLoader(df, page_content_column=\"Name\")\n",
    "\n",
    "# 문서 로드\n",
    "docs = loader.load()\n",
    "\n",
    "# 데이터 출력\n",
    "print(docs[0].page_content)\n",
    "\n",
    "# 메타데이터 출력\n",
    "print(docs[0].metadata)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e643b63a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 큰 테이블에 대한 지연 로딩, 전체 테이블을 메모리에 로드하지 않음\n",
    "for row in loader.lazy_load():\n",
    "    print(row)\n",
    "    break  # 첫 행만 출력"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6fbae6dd",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py-test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
